#define MAXSIZE 100
#include <stdbool.h>

typedef struct {
    char data[MAXSIZE + 1];
    int length;
} SqString;

// 将C语言字符串赋值给顺序串
void StrAssign(SqString* s, char cstr[]) {
    int i;
    for (i = 0; cstr[i] != '\0'; ++i) {
        s->data[i] = cstr[i];
    }
    s->length = i;
    s->data[s->length] = '\0';  // 不要忘记字符串结束符'\0'
}

int Strcmp(SqString* s, SqString* t) {
    int i, comlen;   // 循环控制变量i；串的共同长度comlen
    if(s->length < t->length)
        comlen = s->length; // 求s和t的共同长度
    else comlen = t->length;
    for(i = 0; i < comlen; ++i) {  // 在共同长度内逐个字符比较
        if(s->data[i] > t->data[i])     
            return 1;   // 前串大于后串，返回1
        else if(s->data[i] < t->data[i])    
            return -1;  // 前串小于后串，返回-1
        // 字符相等时继续比较下一个字符
    }
    // 共同部分完全相等，比较长度
    if(s->length == t->length)   
        return 0;   // 两串完全相等，返回0
    else if(s->length > t->length)   
        return 1;   // 串s更长，返回1
    else return -1;  // 串t更长，返回-1
}

SqString Concat(SqString* s, SqString* t) {
    SqString str;  //定义结果串
    int i;
    str.length = s->length + t->length;    
    // 复制第一个字符串
    for (i = 0; i < s->length; i++) {
        str.data[i] = s->data[i];
    }
    // 复制第二个字符串
    for (i = 0; i < t->length; i++) {
        str.data[s->length + i] = t->data[i];
    }
    str.data[str.length] = '\0';  // 不要忘记字符串结束符'\0'
    return str;
}

int SubString(SqString* s, int pos, int len, SqString* sub) {
    int k, j;
    // 参数检查：pos是1基索引，len是要提取的长度
    if (pos < 1 || pos > s->length || len < 0 || pos + len - 1 > s->length) {
        return 0;  // 参数无效
    }
    sub->length = len;
    // 从pos位置开始提取len个字符（pos是1基索引，需要转换为0基）
    for (j = 0, k = pos - 1; j < len; k++, j++) {
        sub->data[j] = s->data[k];
    }
    sub->data[sub->length] = '\0';  // 不要忘记字符串结束符'\0'
    return 1;
}

void StrCopy(SqString* s, SqString* t) {
    int i;
    // 将s复制到t
    for (i = 0; i < s->length; ++i) {
        t->data[i] = s->data[i];
    }
    t->length = s->length;
    t->data[t->length] = '\0';  // 不要忘记字符串结束符'\0'
}

// 返回子串t在主串s中第一次出现的位置，若不存在，则返回-1
int BFMatching(SqString* s, SqString* t) {
    int i = 0, j = 0;
    while (i < s->length && j < t->length) {
        if (s->data[i] == t->data[j]) {
            ++i;
            ++j;
        } else {
            i = i - j + 1;
            j = 0;
        }
    }
    if (j == t->length) {
        return i - t->length;
    }
    return -1;
}